ipyaudio Demo

This notebook illustrates how to use ipyaudio for interactive and realtime DSP.


In [1]:
# First, load up our ipyaudio module.
import ipyaudio

In [2]:
# Our example function will simply compute the root-mean-squared energy of the buffer
# We'll use IPython's display module to keep the output stationary on screen.

import numpy as np
import IPython.display

def rmse(y, sr):
    
    en = np.sqrt(np.sum(y**2.0))
    
    print 'RMSE: {:0.3e}'.format(en)
    
    IPython.display.clear_output(wait=True)

In general, callback functions must support the following positional arguments:

  • y: the audio buffer (np.ndarray)
  • sr: the sampling rate of the buffer

In [3]:
# Now, let's make an audio connector object
audio_connector = ipyaudio.AudioConnector(rmse, output=True, sr=22050)

# And connect it up to a toggle button
play_widget = ipyaudio.playback_widget(audio_connector)

In [4]:
# And display it in the IPython console
play_widget

In [5]:
# More advanced: keep a running average of rmse
import time

def buffered_rmse(y, sr, alpha=0.5, state=None):
    
    en = np.sqrt(np.sum(y**2.0))
    #time.sleep(0.0)
    
    if state is None:
        raise ValueError('Invalid state buffer!')
        
    if 'en' not in state:
        state['en'] = en
    else:
        state['en'] = alpha * state['en'] + (1-alpha) * en
        
    print 'RMSE: {:0.3e}'.format(state['en'])
    
    IPython.display.clear_output(wait=True)

In [6]:
# Now, let's make an audio connector object
my_state = {}
audio_connector = ipyaudio.AudioConnector(buffered_rmse, output=True, window=128, sr=22050, alpha=0.9, state=my_state)

# And connect it up to a toggle button
play_widget = ipyaudio.playback_widget(audio_connector)

In [7]:
play_widget

In [8]:
my_state


Out[8]:
{}

Audio processing in python

We can also have callbacks that manipulate the stream. This works by returning the modified buffer.

Here's, we'll apply an ideal band-pass filter to the signal


In [26]:
def bpf(y, sr, low=16, high=64):
    
    yhat = np.fft.rfft(y)
    
    yhat[:low] = 0.0
    yhat[high:] = 0.0
    
    return np.fft.irfft(yhat)

In [27]:
# Now, let's make an audio connector object
my_state = {}
audio_connector = ipyaudio.AudioConnector(bpf, output=True, window=256, sr=22050)

# And connect it up to a toggle button
play_widget = ipyaudio.playback_widget(audio_connector)

In [28]:
play_widget